package com.dyna.demo.dictConvert.anno;//package com.dyna.dictConvert.anno;
//
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.parser.Feature;
//import com.dyna.api.response.R;
//import com.dyna.constants.DynaSysConstant;
//import com.dyna.core.utils.*;
//import com.dyna.dictConvert.domain.DictModel;
//import com.dyna.domain.entity.SysDict;
//import com.dyna.utils.DictLocalCacheUtil;
//import com.dyna.utils.RedisUtils;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.lang.reflect.Field;
//import java.util.*;
//import java.util.concurrent.CompletableFuture;
//import java.util.stream.Collectors;
//
///**
// * @author Admin
// */
//@Aspect
//@Component
//@Slf4j
//public class DictAspect {
//
//    @Resource
//    private ObjectMapper objectMapper;
//
//    public static final String SUFFIX = "_dictText";
//
//    /**
//     * 定义切点
//     */
//    @Pointcut("execution(public * com.dyna.dictConvert.*Controller.*(..))")
//    public void pointCut(){}
//
//    @Around("pointCut()")
//    public Object translate(ProceedingJoinPoint point) throws Throwable {
//        long time1=System.currentTimeMillis();
//        Object result = point.proceed();
//        long time2=System.currentTimeMillis();
//        log.debug("获取JSON数据 耗时："+(time2-time1)+"ms");
//        long start=System.currentTimeMillis();
//        this.parseDict(result);
//        long end=System.currentTimeMillis();
//        log.debug("注入字典到JSON数据  耗时"+(end-start)+"ms");
//        return result;
//    }
//
//    /**
//     * 1、遍历结果类的每个字段，查找有dict注解的字段
//     * 2、根据dictCode，在数据字典中找到相应的k-v值
//     * 3、添加到返回结果中
//     */
//    private void parseDict(Object result) {
//        if(result instanceof R) {
//            R r = (R) result;
//            if(r.getData() instanceof List) {
//                List<Object> data = (List<Object>) r.getData();
//
//                JSONArray items = new JSONArray();
//                Map<String, DictModel> map = new HashMap<>(10);
//                // 遍历列表中的对象
//                for (Object record : data) {
//                    String json="{}";
//                    try {
//                        json = objectMapper.writeValueAsString(record);
//                    } catch (JsonProcessingException e) {
//                        log.error("json解析失败"+e.getMessage(),e);
//                    }
//
//                    // 遍历对象中的所有字段
//                    JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
//                    for (Field field : getAllFields(record)) {
//                        // 字段名
//                        String value = item.getString(field.getName());
//                        if (Func.isEmpty(value)) {
//                            continue;
//                        }
//
//                        // 是否添加了字典注解
//                        Dict dict = field.getAnnotation(Dict.class);
//                        if (dict != null) {
//                            map.put(field.getName(), new DictModel(dict.dictType(), value));
//                        }
//                    }
//                    // 使用异步
//                    map.forEach((k, v) -> {
//                        JSONObject join = CompletableFuture.supplyAsync(() -> {
//                            // 翻译后的字段名
//                            String dictText = k.concat(SUFFIX);
//                            // 从字典表查数据
//                            String label = this.getDictDataLabel(v.getDictType(), v.getDictValue());
//                            // 将数据封装进去
//                            item.put(dictText, label);
//                            return item;
//                            }).join();
//                            items.add(join);
//                    });
//                }
//
//                ((R) result).setData(items);
//            }
//        }
//    }
//
//    /**
//     * 获取字典label
//     * @param dictType 字典类型
//     * @param dictValue 字典value
//     * @return label
//     */
//    private String getDictDataLabel(String dictType, String dictValue) {
//        Object hget = RedisUtils.hmget(dictType);
//        if (ObjectUtil.isEmpty(hget)) {
//            List<SysDict> dictDataByType = DictLocalCacheUtil.getDictDataByType(dictType);
//            if (CollectionUtil.isNotEmpty(dictDataByType)) {
//                RedisUtils.hmset(dictType, dictDataByType.stream().collect(Collectors.toMap(SysDict::getDictValue, SysDict::getDictLabel)));
//            }
//        }
//        Object label = RedisUtils.hget(dictType, dictValue);
//        if (label != null) {
//            return String.valueOf(label);
//        }
//        return DynaSysConstant.STR_EMPYTY;
//    }
//
//    public static Field[] getAllFields(Object object) {
//        Class<?> clazz = object.getClass();
//        List<Field> fieldList = new ArrayList<>();
//        while (clazz != null) {
//            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
//            clazz = clazz.getSuperclass();
//        }
//        Field[] fields = new Field[fieldList.size()];
//        fieldList.toArray(fields);
//        return fields;
//    }
//
//}